home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / byt85jan.lbr / PRIME.BQS / PRIME.BAS
BASIC Source File  |  1985-09-15  |  4KB  |  57 lines

  1. 10 '**************************************************************************
  2. 20 '*                                                                        *
  3. 30 '*          PROGRAM TO FACTOR A NUMBER INTO PRODUCTS OF PRIMES            *
  4. 40 '*                                                                        *
  5. 50 '**************************************************************************
  6. 60 CLS
  7. 70 DEFINT A-Z
  8. 80 INPUT "Enter largest number to be factored";NUMBER
  9. 90 IF NUMBER<2 THEN PRINT "NUMBER MUST BE LARGER THAN 1":GOTO 80
  10. 100            REM FIRST, FIND THE NECESSARY PRIMES.  FLAG.ARRAY WILL FLAG                         NONPRIME (COMPOSITE) NUMBERS, PRIME ARRAY WILL HOLD PRIMES                      WHEN FOUND.  SOME BASICS REQUIRE SHORTER VARIABLE NAMES.
  11. 110            REM SIEVE ALGORITHM PROVIDED BY WILLIAM F. DOSSETT OF AUSTIN,TX.
  12. 120 DIM FLAG.ARRAY(NUMBER),PRIME(NUMBER)
  13. 130 COMPOSITE=-1                        'NONPRIME FLAG.ARRAY ELEMENT WILL BE                                             GIVEN TRUTH-VALUE `T'
  14. 140 INDEX=1                             'SUBSCRIPT OF LARGEST NONEMPTY ENTRY IN                                          PRIME ARRAY
  15. 150 PRIME(INDEX)=2                      'DECLARE 2 PRIME AND LIMIT PRIME SEARCH                                          TO ODD NUMBERS
  16. 160            REM AVOID UNNECESSARY DUPLICATION IN SEARCH.  FIRST NONPRIME ODD                    NUMBER IS 9 (3 SQUARED), FIRST COMPOSITE ODD NUMBER NOT                         DIVISIBLE BY 3 IS 25 (5 SQUARED), ETC.
  17. 170 FOR K=3 TO SQR(NUMBER) STEP 2
  18. 180     IF FLAG.ARRAY(K) THEN 220       'SKIP TO NEXT PRIME
  19. 190     FOR I=K*K TO NUMBER STEP K+K    'FLAG THE ODD NUMBERS IT DIVIDES
  20. 200             FLAG.ARRAY(I)=COMPOSITE
  21. 210     NEXT
  22. 220 NEXT
  23. 230 INPUT "Do you want a listing of the primes found (y/n)";PRIMEPRINT$
  24. 240 IF PRIMEPRINT$="y" THEN PRIMEPRINT$="Y"
  25. 250            REM COPY ALL PRIMES FOUND TO PRIME ARRAY, PRINT PRIMES IF                           SO REQUESTED IN 230.
  26. 260 FOR I=3 TO NUMBER STEP 2
  27. 270     IF NOT FLAG.ARRAY(I) THEN INDEX=INDEX+1:PRIME(INDEX)=I:IF PRIMEPRINT$=                                    "Y" THEN PRINT PRIME(INDEX);
  28. 280 NEXT
  29. 290 PRINT:PRINT
  30. 300 PRIME(INDEX+1)=NUMBER+1             'MARK END OF PRIME ARRAY IN CASE NUMBER                                          IS PRIME
  31. 310 MAXNUMBER=NUMBER                    'SAVE VALUE OF LARGEST NUMBER GUARANTEED                                         FACTORABLE WITH CURRENT PRIMES LIST.
  32. 320 DIVISORS=1                          'INITIALIZE NUMBER OF DIVISORS COUNTER
  33. 330 SUBSCRIPT=1                         'ACTIVE ELEMENT OF PRIME ARRAY
  34. 340 PRIME=PRIME(SUBSCRIPT)
  35. 350            REM PRINT UNIQUE FACTORING OF NUMBER
  36. 360 PRINT NUMBER;" CAN BE UNIQUELY FACTORED AS:"
  37. 370            REM IF YOUR BASIC DOES NOT SUPPORT `WHILE...WEND', CHANGE LINE                      380 TO: IF PRIME>NUMBER THEN 480.
  38. 380 WHILE PRIME<=NUMBER
  39. 390            REM WHAT POWER OF THE ACTIVE PRIME IS A FACTOR OF THE NUMBER?                       NOTE THAT, ALTHOUGH ALL VARIABLES HAVE BEEN DECLARED INTEGER,                   NUMBER/PRIME NEED NOT HAVE AN INTEGER VALUE.
  40. 400     IF NUMBER/PRIME=INT(NUMBER/PRIME) THEN EXPONENT=EXPONENT+1:                                                            NUMBER=NUMBER/PRIME:GOTO 400
  41. 410            REM PRINT THE RUNNING RESULTS, INCREMENT DIVISORS
  42. 420     IF EXPONENT>0 THEN PRINT "(";PRIME;"TO THE";EXPONENT;")";:                                         DIVISORS=DIVISORS*(EXPONENT+1)
  43. 430            REM RESET POWER COUNTER, LOOP
  44. 440     EXPONENT=0
  45. 450     SUBSCRIPT=SUBSCRIPT+1:PRIME=PRIME(SUBSCRIPT)
  46. 460 WEND
  47. 470            REM IF YOUR BASIC DOES NOT SUPPORT `WHILE...WEND', CHANGE LINE                      460 TO: GOTO 380
  48. 480 PRINT:PRINT "NUMBER OF DIVISORS =";DIVISORS
  49. 490 PRINT :PRINT
  50. 500            REM IF MORE NUMBERS ARE TO BE FACTORED, DETERMINE WHETHER THE                       CURRENT PRIMES LIST IS ADEQUATE.  IF SO, USE IT.  IF NOT,                       ERASE ARRAYS TO AVOID PROGRAM CRASH AND RECALCULATE PRIMES.
  51. 510 INPUT "Do you want to factor another number (y/n)";CHOICE$
  52. 520 IF CHOICE$<>"y" AND CHOICE$<>"Y" THEN 560
  53. 530 CLS
  54. 540 INPUT "Enter the new number to be factored";NUMBER
  55. 550 IF NUMBER<=MAXNUMBER THEN 320 ELSE ERASE FLAG.ARRAY,PRIME:GOTO 120
  56. 560 END
  57.